home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / autoconf / autotest / general.m4 < prev   
Text File  |  2006-04-25  |  40KB  |  1,262 lines

  1. # This file is part of Autoconf.                          -*- Autoconf -*-
  2. # M4 macros used in building test suites.
  3. # Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
  4.  
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2, or (at your option)
  8. # any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  18. # 02111-1307, USA.
  19.  
  20. # As a special exception, the Free Software Foundation gives unlimited
  21. # permission to copy, distribute and modify the configure scripts that
  22. # are the output of Autoconf.  You need not follow the terms of the GNU
  23. # General Public License when using or distributing such scripts, even
  24. # though portions of the text of Autoconf appear in them.  The GNU
  25. # General Public License (GPL) does govern all other use of the material
  26. # that constitutes the Autoconf program.
  27. #
  28. # Certain portions of the Autoconf source text are designed to be copied
  29. # (in certain cases, depending on the input) into the output of
  30. # Autoconf.  We call these the "data" portions.  The rest of the Autoconf
  31. # source text consists of comments plus executable code that decides which
  32. # of the data portions to output in any given case.  We call these
  33. # comments and executable code the "non-data" portions.  Autoconf never
  34. # copies any of the non-data portions into its output.
  35. #
  36. # This special exception to the GPL applies to versions of Autoconf
  37. # released by the Free Software Foundation.  When you make and
  38. # distribute a modified version of Autoconf, you may extend this special
  39. # exception to the GPL to apply to your modified version as well, *unless*
  40. # your modified version has the potential to copy into its output some
  41. # of the text that was the non-data portion of the version that you started
  42. # with.  (In other words, unless your change moves or copies text from
  43. # the non-data portions to the data portions.)  If your modification has
  44. # such potential, you must delete any notice of this special exception
  45. # to the GPL from your modified version.
  46.  
  47. # _m4_divert(DIVERSION-NAME)
  48. # --------------------------
  49. # Convert a diversion name into its number.  Otherwise, return
  50. # DIVERSION-NAME which is supposed to be an actual diversion number.
  51. # Of course it would be nicer to use m4_case here, instead of zillions
  52. # of little macros, but it then takes twice longer to run `autoconf'!
  53. #
  54. # From M4sugar:
  55. #    -1. KILL
  56. # 10000. GROW
  57. #
  58. # From M4sh:
  59. #    0. BINSH
  60. #    1. HEADER-REVISION
  61. #    2. HEADER-COMMENT
  62. #    3. HEADER-COPYRIGHT
  63. #    4. M4SH-INIT
  64. # 1000. BODY
  65. #
  66. # Defined below:
  67. #  - DEFAULTS
  68. #    Overall initialization, value of $at_groups_all.
  69. #  - PARSE_ARGS_BEGIN
  70. #    Setup defaults required for option processing.
  71. #  - PARSE_ARGS
  72. #    Option processing.  After AT_INIT, user options can be entered here as
  73. #    cases of a case statement.
  74. #  - PARSE_ARGS_END
  75. #    Finish up the option processing.
  76. #  - HELP
  77. #    Start printing the help message.
  78. #  - HELP_MODES
  79. #    Modes help text.  Additional modes can be appended as self-contained
  80. #    cat'd here-docs as generated by AS_HELP_STRING.
  81. #  - HELP_TUNING
  82. #    TUning help text.  Additional tuning options can be appended as
  83. #    self-contained cat'd here-docs as generated by AS_HELP_STRING.
  84. #  - HELP_OTHER
  85. #    User help can be appended to this as self-contained cat'd here-docs.
  86. #  - HELP_END
  87. #    Finish up the help texts.
  88. #  - PREPARE_TESTS
  89. #    Like DEFAULTS but run after argument processing for purposes of
  90. #    optimization.  Do anything else that needs to be done to prepare for
  91. #    tests.  Sets up verbose and log file descriptors.  Sets and logs PATH.
  92. #  - TESTS
  93. #    The core of the test suite.
  94. #  - TESTS_END
  95. #    tail of the core for;case, overall wrap up, generation of debugging
  96. #    scripts and statistics.
  97. #  - TEST_SCRIPT
  98. #    The code for each test, the ``normal'' diversion
  99.  
  100. m4_define([_m4_divert(DEFAULTS)],           100)
  101. m4_define([_m4_divert(PARSE_ARGS_BEGIN)],   200)
  102. m4_define([_m4_divert(PARSE_ARGS)],         201)
  103. m4_define([_m4_divert(PARSE_ARGS_END)],     202)
  104. m4_define([_m4_divert(HELP)],               300)
  105. m4_define([_m4_divert(HELP_MODES)],         301)
  106. m4_define([_m4_divert(HELP_TUNING)],        302)
  107. m4_define([_m4_divert(HELP_OTHER)],         303)
  108. m4_define([_m4_divert(HELP_END)],           304)
  109. m4_define([_m4_divert(PREPARE_TESTS)],      400)
  110. m4_define([_m4_divert(TESTS)],              401)
  111. m4_define([_m4_divert(TESTS_END)],          402)
  112. m4_define([_m4_divert(TEST_SCRIPT)],        403)
  113.  
  114.  
  115. # AT_LINE
  116. # -------
  117. # Return the current file sans directory, a colon, and the current
  118. # line.  Be sure to return a _quoted_ filename, so if, for instance,
  119. # the user is lunatic enough to have a file named `dnl' (and I, for
  120. # one, love to be brainless and stubborn sometimes), then we return a
  121. # quoted name.
  122. #
  123. # Gee, we can't use simply
  124. #
  125. #  m4_bpatsubst(__file__, [^.*/\(.*\)], [[\1]])
  126. #
  127. # since then, since `dnl' doesn't match the pattern, it is returned
  128. # with once quotation level less, so you lose!  And since GNU M4
  129. # is one of the biggest junk in the whole universe wrt regexp, don't
  130. # even think about using `?' or `\?'.  Bah, `*' will do.
  131. # Pleeeeeeeease, Gary, provide us with dirname and ERE!
  132. m4_define([AT_LINE],
  133. [m4_bpatsubst(__file__, [^\(.*/\)*\(.*\)], [[\2]]):__line__])
  134.  
  135.  
  136. # AT_INIT([TESTSUITE-NAME])
  137. # -------------------------
  138. # Begin test suite.
  139. m4_define([AT_INIT],
  140. [m4_pattern_forbid([^_?AT_])
  141. m4_define([AT_TESTSUITE_NAME],
  142.       m4_defn([AT_PACKAGE_STRING])[ test suite]m4_ifval([$1], [: $1]))
  143. m4_define([AT_ordinal], 0)
  144. m4_define([AT_banner_ordinal], 0)
  145. AS_INIT
  146. AS_PREPARE
  147. m4_divert_push([DEFAULTS])dnl
  148.  
  149. SHELL=${CONFIG_SHELL-/bin/sh}
  150.  
  151. # How were we run?
  152. at_cli_args="$[@]"
  153.  
  154. # Load the config file.
  155. for at_file in atconfig atlocal
  156. do
  157.   test -r $at_file || continue
  158.   . ./$at_file || AS_ERROR([invalid content: $at_file])
  159. done
  160.  
  161. # atconfig delivers paths relative to the directory the test suite is
  162. # in, but the groups themselves are run in testsuite-dir/group-dir.
  163. if test -n "$at_top_srcdir"; then
  164.   builddir=../..
  165.   for at_dir in srcdir top_srcdir top_builddir
  166.   do
  167.     at_val=AS_VAR_GET(at_$at_dir)
  168.     AS_VAR_SET($at_dir, $at_val/../..)
  169.   done
  170. fi
  171.  
  172. # Not all shells have the 'times' builtin; the subshell is needed to make
  173. # sure we discard the 'times: not found' message from the shell.
  174. at_times_p=false
  175. (times) >/dev/null 2>&1 && at_times_p=:
  176.  
  177. # CLI Arguments to pass to the debugging scripts.
  178. at_debug_args=
  179. # -e sets to true
  180. at_errexit_p=false
  181. # Shall we be verbose?
  182. at_verbose=:
  183. at_quiet=echo
  184.  
  185. # Shall we keep the debug scripts?  Must be `:' when the suite is
  186. # run by a debug script, so that the script doesn't remove itself.
  187. at_debug_p=false
  188. # Display help message?
  189. at_help_p=false
  190. # List test groups?
  191. at_list_p=false
  192. # Test groups to run
  193. at_groups=
  194.  
  195. # The directory we are in.
  196. at_dir=`pwd`
  197. # The directory the whole suite works in.
  198. # Should be absolutely to let the user `cd' at will.
  199. at_suite_dir=$at_dir/$as_me.dir
  200. # The file containing the suite.
  201. at_suite_log=$at_dir/$as_me.log
  202. # The file containing the location of the last AT_CHECK.
  203. at_check_line_file=$at_suite_dir/at-check-line
  204. # The file containing the exit status of the last command.
  205. at_status_file=$at_suite_dir/at-status
  206. # The files containing the output of the tested commands.
  207. at_stdout=$at_suite_dir/at-stdout
  208. at_stder1=$at_suite_dir/at-stder1
  209. at_stderr=$at_suite_dir/at-stderr
  210. # The file containing dates.
  211. at_times_file=$at_suite_dir/at-times
  212. m4_divert_pop([DEFAULTS])dnl
  213. m4_wrap([m4_divert_text([DEFAULTS],
  214. [
  215. # List of the tested programs.
  216. at_tested='m4_ifdef([AT_tested], [AT_tested])'
  217. # List of the all the test groups.
  218. at_groups_all='AT_groups_all'
  219. # As many dots as there are digits in the last test group number.
  220. # Used to normalize the test group numbers so that `ls' lists them in
  221. # numerical order.
  222. at_format='m4_bpatsubst(m4_defn([AT_ordinal]), [.], [.])'
  223. # Description of all the test groups.
  224. at_help_all='AT_help_all'])])dnl
  225. m4_divert_push([PARSE_ARGS])dnl
  226.  
  227. at_keywords=
  228. at_prev=
  229. for at_option
  230. do
  231.   # If the previous option needs an argument, assign it.
  232.   if test -n "$at_prev"; then
  233.     at_option=$at_prev=$at_option
  234.     at_prev=
  235.   fi
  236.  
  237.   at_optarg=`expr "x$at_option" : 'x[[^=]]*=\(.*\)'`
  238.  
  239.   # Accept the important Cygnus configure options, so we can diagnose typos.
  240.  
  241.   case $at_option in
  242.     --help | -h )
  243.     at_help_p=:
  244.     ;;
  245.  
  246.     --list | -l )
  247.     at_list_p=:
  248.     ;;
  249.  
  250.     --version | -V )
  251.     echo "$as_me (AT_PACKAGE_STRING)"
  252.     exit 0
  253.     ;;
  254.  
  255.     --clean | -c )
  256.     rm -rf $at_suite_dir $at_suite_log
  257.     exit 0
  258.     ;;
  259.  
  260.     --debug | -d )
  261.     at_debug_p=:
  262.     ;;
  263.  
  264.     --errexit | -e )
  265.     at_debug_p=:
  266.     at_errexit_p=:
  267.     ;;
  268.  
  269.     --verbose | -v )
  270.     at_verbose=echo; at_quiet=:
  271.     ;;
  272.  
  273.     --trace | -x )
  274.     at_traceon='set -vx'; at_traceoff='set +vx'
  275.     ;;
  276.  
  277.     [[0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9]])
  278.     at_groups="$at_groups$at_option "
  279.     ;;
  280.  
  281.     # Ranges
  282.     [[0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-])
  283.     at_range_start=`echo $at_option |tr -d '-'`
  284.     at_range=`echo " $at_groups_all " | \
  285.       sed -e 's,^.* '$at_range_start' ,'$at_range_start' ,'`
  286.     at_groups="$at_groups$at_range "
  287.     ;;
  288.  
  289.     [-[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9]])
  290.     at_range_end=`echo $at_option |tr -d '-'`
  291.     at_range=`echo " $at_groups_all " | \
  292.       sed -e 's, '$at_range_end' .*$, '$at_range_end','`
  293.     at_groups="$at_groups$at_range "
  294.     ;;
  295.  
  296.     [[0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9]] | \
  297.     [[0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9]] | \
  298.     [[0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9]] | \
  299.     [[0-9][0-9][0-9]-[0-9][0-9][0-9]] | \
  300.     [[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]] | \
  301.     [[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]] )
  302.     at_range_start=`echo $at_option |sed 's,-.*,,'`
  303.     at_range_end=`echo $at_option |sed 's,.*-,,'`
  304.     # FIXME: Maybe test to make sure start <= end?
  305.     at_range=`echo " $at_groups_all " | \
  306.       sed -e 's,^.* '$at_range_start' ,'$at_range_start' ,' \
  307.           -e 's, '$at_range_end' .*$, '$at_range_end','`
  308.     at_groups="$at_groups$at_range "
  309.     ;;
  310.  
  311.     # Keywords.
  312.     --keywords | -k )
  313.     at_prev=--keywords
  314.     ;;
  315.     --keywords=* )
  316.     at_keywords="$at_keywords,$at_optarg"
  317.     ;;
  318. m4_divert_pop([PARSE_ARGS])dnl
  319. dnl Process *=* last to allow for user specified --option=* type arguments.
  320. m4_divert_push([PARSE_ARGS_END])dnl
  321.  
  322.     *=*)
  323.       at_envvar=`expr "x$at_option" : 'x\([[^=]]*\)='`
  324.       # Reject names that are not valid shell variable names.
  325.       expr "x$at_envvar" : "[.*[^_$as_cr_alnum]]" >/dev/null &&
  326.         AS_ERROR([invalid variable name: $at_envvar])
  327.       at_value=`echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"`
  328.       eval "$at_envvar='$at_value'"
  329.       export $at_envvar
  330.     # Propagate to debug scripts.
  331.       at_debug_args="$at_debug_args $at_option"
  332.       ;;
  333.  
  334.      *) echo "$as_me: invalid option: $at_option" >&2
  335.     echo "Try \`$[0] --help' for more information." >&2
  336.     exit 1
  337.     ;;
  338.   esac
  339. done
  340.  
  341. # Process the --keywords
  342. if test -n "$at_keywords"; then
  343.   at_groups_selected=$at_help_all
  344.   for at_keyword in `IFS=,; set X $at_keywords; shift; echo ${1+$[@]}`
  345.   do
  346.     # It is on purpose that we match the test group titles too.
  347.     at_groups_selected=`echo "$at_groups_selected" |
  348.             grep -i "^[[^;]]*;[[^;]]*.*[[; ]]$at_keyword[[ ;]]"`
  349.   done
  350.   at_groups_selected=`echo "$at_groups_selected" | sed 's/;.*//'`
  351.   # Smash the end of lines.
  352.   at_groups_selected=`echo $at_groups_selected`
  353.   at_groups="$at_groups$at_groups_selected "
  354. fi
  355.  
  356. # Selected test groups.
  357. test -z "$at_groups" && at_groups=$at_groups_all
  358. m4_divert_pop([PARSE_ARGS_END])dnl
  359. m4_divert_push([HELP])dnl
  360.  
  361. # Help message.
  362. if $at_help_p; then
  363.   cat <<_ATEOF
  364. Usage: $[0] [[OPTION]... [VARIABLE=VALUE]... [TESTS]]
  365.  
  366. Run all the tests, or the selected TESTS, and save a detailed log file.
  367. Upon failure, create debugging scripts.
  368.  
  369. You should not change environment variables unless explicitly passed
  370. as command line arguments.  Set \`AUTOTEST_PATH' to select the executables
  371. to exercise.  Each relative directory is expanded as build and source
  372. directories relatively to the top level of this distribution.  E.g.,
  373.  
  374.   $ $[0] AUTOTEST_PATH=bin
  375.  
  376. possibly amounts into
  377.  
  378.   PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH
  379. _ATEOF
  380. m4_divert_pop([HELP])dnl
  381. m4_divert_push([HELP_MODES])dnl
  382. cat <<_ATEOF
  383.  
  384. Operation modes:
  385.   -h, --help     print the help message, then exit
  386.   -V, --version  print version number, then exit
  387.   -c, --clean    remove all the files this test suite might create and exit
  388.   -l, --list     describes all the tests, or the selected TESTS
  389. _ATEOF
  390. m4_divert_pop([HELP_MODES])dnl
  391. m4_divert_push([HELP_TUNING])dnl
  392. cat <<_ATEOF
  393.  
  394. Execution tuning:
  395.   -k, --keywords=KEYWORDS
  396.              select the tests matching all the comma separated KEYWORDS
  397.              accumulates
  398.   -e, --errexit  abort as soon as a test fails; implies --debug
  399.   -v, --verbose  force more detailed output
  400.              default for debugging scripts
  401.   -d, --debug    inhibit clean up and debug script creation
  402.              default for debugging scripts
  403.   -x, --trace    enable tests shell tracing
  404. _ATEOF
  405. m4_divert_pop([HELP_TUNING])dnl
  406. m4_divert_push([HELP_END])dnl
  407. cat <<_ATEOF
  408.  
  409. Report bugs to <AT_PACKAGE_BUGREPORT>.
  410. _ATEOF
  411.   exit 0
  412. fi
  413.  
  414. # List of tests.
  415. if $at_list_p; then
  416.   cat <<_ATEOF
  417. AT_TESTSUITE_NAME test groups:
  418.  
  419.  NUM: FILENAME:LINE      TEST-GROUP-NAME
  420.       KEYWORDS
  421.  
  422. _ATEOF
  423.   # "  1 42  45 " => "^(1|42|45);".
  424.   at_groups_pattern=`echo "$at_groups" | sed 's/^  *//;s/  *$//;s/  */|/g'`
  425.   echo "$at_help_all" |
  426.     awk 'BEGIN { FS = ";" }
  427.      { if ($[1] !~ /^('"$at_groups_pattern"')$/) next }
  428.      { if ($[1]) printf " %3d: %-18s %s\n", $[1], $[2], $[3]
  429.        if ($[4]) printf "      %s\n", $[4] } '
  430.   exit 0
  431. fi
  432. m4_divert_pop([HELP_END])dnl
  433. m4_divert_push([PREPARE_TESTS])dnl
  434.  
  435. # Don't take risks: use only absolute directories in PATH.
  436. #
  437. # For stand-alone test suites, AUTOTEST_PATH is relative to `.'.
  438. #
  439. # For embedded test suites, AUTOTEST_PATH is relative to the top level
  440. # of the package.  Then expand it into build/src parts, since users
  441. # may create executables in both places.
  442. #
  443. # There might be directories that don't exist, but don't redirect
  444. # builtins' (eg., cd) stderr directly: Ultrix's sh hates that.
  445. AUTOTEST_PATH=`echo $AUTOTEST_PATH | tr ':' $PATH_SEPARATOR`
  446. at_path=
  447. _AS_PATH_WALK([$AUTOTEST_PATH $PATH],
  448. [case $as_dir in
  449.   [[\\/]]* | ?:[[\\/]]* )
  450.     at_path=$at_path$PATH_SEPARATOR$as_dir
  451.     ;;
  452.   * )
  453.     if test -z "$at_top_builddir"; then
  454.       # Stand-alone test suite.
  455.       at_path=$at_path$PATH_SEPARATOR$as_dir
  456.     else
  457.       # Embedded test suite.
  458.       at_path=$at_path$PATH_SEPARATOR$at_top_builddir/$as_dir
  459.       at_path=$at_path$PATH_SEPARATOR$at_top_srcdir/$as_dir
  460.     fi
  461.     ;;
  462. esac])
  463.  
  464. # Now build and simplify PATH.
  465. PATH=
  466. _AS_PATH_WALK([$at_path],
  467. [as_dir=`(cd "$as_dir" && pwd) 2>/dev/null`
  468. test -d "$as_dir" || continue
  469. case $PATH in
  470.               $as_dir                 | \
  471.               $as_dir$PATH_SEPARATOR* | \
  472.   *$PATH_SEPARATOR$as_dir                 | \
  473.   *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR* ) ;;
  474.  
  475.   '') PATH=$as_dir ;;
  476.    *) PATH=$PATH$PATH_SEPARATOR$as_dir ;;
  477. esac])
  478. export PATH
  479.  
  480. # Setting up the FDs.
  481. # 5 is the log file.  Not to be overwritten if `-d'.
  482. m4_define([AS_MESSAGE_LOG_FD], [5])
  483. $at_debug_p && at_suite_log=/dev/null
  484. exec AS_MESSAGE_LOG_FD>$at_suite_log
  485.  
  486. # Banners and logs.
  487. AS_BOX(m4_defn([AT_TESTSUITE_NAME])[.])
  488. {
  489.   AS_BOX(m4_defn([AT_TESTSUITE_NAME])[.])
  490.   echo
  491.  
  492.   echo "$as_me: command line was:"
  493.   echo "  $ $[0] $at_cli_args"
  494.   echo
  495.  
  496.   # Try to find a few ChangeLogs in case it might help determining the
  497.   # exact version.  Use the relative dir: if the top dir is a symlink,
  498.   # find will not follow it (and options to follow the links are not
  499.   # portable), which would result in no output here.
  500.   if test -n "$at_top_srcdir"; then
  501.     AS_BOX([ChangeLogs.])
  502.     echo
  503.     for at_file in `find "$at_top_srcdir" -name ChangeLog -print`
  504.     do
  505.       echo "$as_me: $at_file:"
  506.       sed 's/^/| /;10q' $at_file
  507.       echo
  508.     done
  509.  
  510.     AS_UNAME
  511.     echo
  512.   fi
  513.  
  514.   # Contents of the config files.
  515.   for at_file in atconfig atlocal
  516.   do
  517.     test -r $at_file || continue
  518.     echo "$as_me: $at_file:"
  519.     sed 's/^/| /' $at_file
  520.     echo
  521.   done
  522.  
  523.   AS_BOX([Tested programs.])
  524.   echo
  525. } >&AS_MESSAGE_LOG_FD
  526.  
  527. # Report what programs are being tested.
  528. for at_program in : $at_tested
  529. do
  530.   test "$at_program" = : && continue
  531.   _AS_PATH_WALK([$PATH], [test -f $as_dir/$at_program && break])
  532.   if test -f $as_dir/$at_program; then
  533.     {
  534.       echo "AT_LINE: $as_dir/$at_program --version"
  535.       $as_dir/$at_program --version
  536.       echo
  537.     } >&AS_MESSAGE_LOG_FD 2>&1
  538.   else
  539.     AS_ERROR([cannot find $at_program])
  540.   fi
  541. done
  542.  
  543. {
  544.   AS_BOX([Running the tests.])
  545. } >&AS_MESSAGE_LOG_FD
  546.  
  547. at_start_date=`date`
  548. at_start_time=`(date +%s) 2>/dev/null`
  549. echo "$as_me: starting at: $at_start_date" >&AS_MESSAGE_LOG_FD
  550. at_xpass_list=
  551. at_xfail_list=
  552. at_pass_list=
  553. at_fail_list=
  554. at_skip_list=
  555. at_group_count=0
  556. m4_divert_pop([PREPARE_TESTS])dnl
  557. m4_divert_push([TESTS])dnl
  558.  
  559. # Create the master directory if it doesn't already exist.
  560. test -d $at_suite_dir ||
  561.   mkdir $at_suite_dir ||
  562.   AS_ERROR([cannot create $at_suite_dir])
  563.  
  564. # Can we diff with `/dev/null'?  DU 5.0 refuses.
  565. if diff /dev/null /dev/null >/dev/null 2>&1; then
  566.   at_devnull=/dev/null
  567. else
  568.   at_devnull=$at_suite_dir/devnull
  569.   cp /dev/null $at_devnull
  570. fi
  571.  
  572. # Use `diff -u' when possible.
  573. if diff -u $at_devnull $at_devnull >/dev/null 2>&1; then
  574.   at_diff='diff -u'
  575. else
  576.   at_diff=diff
  577. fi
  578.  
  579.  
  580. for at_group in $at_groups
  581. do
  582.   # Be sure to come back to the top test directory.
  583.   cd $at_suite_dir
  584.  
  585.   case $at_group in
  586.     banner-*)
  587.       at_group_log=$at_suite_log
  588.       ;;
  589.  
  590.     *)
  591.       # Skip tests we already run (using --keywords makes it easy to get
  592.       # duplication).
  593.       case " $at_pass_test $at_skip_test $at_fail_test " in
  594.     *" $at_group "* ) continue;;
  595.       esac
  596.  
  597.       # Normalize the test group number.
  598.       at_group_normalized=`expr "00000$at_group" : ".*\($at_format\)"`
  599.  
  600.       # Create a fresh directory for the next test group, and enter.
  601.       at_group_dir=$at_suite_dir/$at_group_normalized
  602.       at_group_log=$at_group_dir/$as_me.log
  603.       rm -rf $at_group_dir
  604.       mkdir $at_group_dir ||
  605.     AS_ERROR([cannot create $at_group_dir])
  606.       cd $at_group_dir
  607.       ;;
  608.   esac
  609.  
  610.   echo 0 > $at_status_file
  611.  
  612.   # Clearly separate the test groups when verbose.
  613.   test $at_group_count != 0 && $at_verbose
  614.  
  615.   # In verbose mode, append to the log file *and* show on
  616.   # the standard output; in quiet mode only write to the log
  617.   if test $at_verbose = echo; then
  618.     at_tee_pipe="tee -a $at_group_log"
  619.   else
  620.     at_tee_pipe="cat >> $at_group_log"
  621.   fi
  622.  
  623.   case $at_group in
  624. dnl Test groups inserted here (TESTS).
  625. m4_divert_pop([TESTS])[]dnl
  626. m4_divert_push([TESTS_END])[]dnl
  627.  
  628.   * )
  629.     echo "$as_me: no such test group: $at_group" >&2
  630.     continue
  631.     ;;
  632.   esac
  633.  
  634.   # Be sure to come back to the suite directory, in particular
  635.   # since below we might `rm' the group directory we are in currently.
  636.   cd $at_suite_dir
  637.  
  638.   case $at_group in
  639.     banner-*) ;;
  640.     *)
  641.       if test ! -f $at_check_line_file; then
  642.     sed "s/^ */$as_me: warning: /" <<_ATEOF
  643.     A failure happened in a test group before any test could be
  644.     run. This means that test suite is improperly designed.  Please
  645.     report this failure to <AT_PACKAGE_BUGREPORT>.
  646. _ATEOF
  647.         echo "$at_setup_line" >$at_check_line_file
  648.       fi
  649.       at_group_count=`expr 1 + $at_group_count`
  650.       $at_verbose $ECHO_N "$at_group. $at_setup_line: $ECHO_C"
  651.       echo $ECHO_N "$at_group. $at_setup_line: $ECHO_C" >> $at_group_log
  652.       case $at_xfail:$at_status in
  653.     yes:0)
  654.         at_msg="UNEXPECTED PASS"
  655.         at_xpass_list="$at_xpass_list $at_group"
  656.         at_errexit=$at_errexit_p
  657.         ;;
  658.     no:0)
  659.         at_msg="ok"
  660.         at_pass_list="$at_pass_list $at_group"
  661.         at_errexit=false
  662.         ;;
  663.     *:77)
  664.         at_msg="skipped (`cat $at_check_line_file`)"
  665.         at_skip_list="$at_skip_list $at_group"
  666.         at_errexit=false
  667.         ;;
  668.     yes:*)
  669.         at_msg="expected failure (`cat $at_check_line_file`)"
  670.         at_xfail_list="$at_xfail_list $at_group"
  671.         at_errexit=false
  672.         ;;
  673.     no:*)
  674.         at_msg="FAILED (`cat $at_check_line_file`)"
  675.         at_fail_list="$at_fail_list $at_group"
  676.         at_errexit=$at_errexit_p
  677.         ;;
  678.       esac
  679.       echo $at_msg
  680.       at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg"
  681.       case $at_status in
  682.     0|77)
  683.       # $at_times_file is only available if the group succeeded.
  684.       # We're not including the group log, so the success message
  685.       # is written in the global log separately.  But we also
  686.       # write to the group log in case they're using -d.
  687.       if test -f $at_times_file; then
  688.         at_log_msg="$at_log_msg    (`sed 1d $at_times_file`)"
  689.         rm -f $at_times_file
  690.           fi
  691.       echo "$at_log_msg" >> $at_group_log
  692.       echo "$at_log_msg" >&AS_MESSAGE_LOG_FD
  693.  
  694.       # Cleanup the group directory, unless the user wants the files.
  695.       $at_debug_p || rm -rf $at_group_dir
  696.       ;;
  697.     *)
  698.       # Upon failure, include the log into the testsuite's global
  699.       # log.  The failure message is written in the group log.  It
  700.       # is later included in the global log.
  701.       echo "$at_log_msg" >> $at_group_log
  702.  
  703.       # Upon failure, keep the group directory for autopsy, and
  704.       # create the debugging script.
  705.       {
  706.         echo "#! /bin/sh"
  707.         echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$[@]"}'\''='\''"$[@]"'\'''
  708.         echo "cd $at_dir"
  709.         echo 'exec ${CONFIG_SHELL-'"$SHELL"'}' "$[0]" \
  710.              '-v -d' "$at_debug_args" "$at_group" '${1+"$[@]"}'
  711.         echo 'exit 1'
  712.       } >$at_group_dir/run
  713.       chmod +x $at_group_dir/run
  714.       $at_errexit && break
  715.       ;;
  716.       esac
  717.       ;;
  718.   esac
  719. done
  720.  
  721. # Back to the top directory.
  722. cd $at_dir
  723.  
  724. # Compute the duration of the suite.
  725. at_stop_date=`date`
  726. at_stop_time=`(date +%s) 2>/dev/null`
  727. echo "$as_me: ending at: $at_stop_date" >&AS_MESSAGE_LOG_FD
  728. at_duration_s=`(expr $at_stop_time - $at_start_time) 2>/dev/null`
  729. at_duration_m=`(expr $at_duration_s / 60) 2>/dev/null`
  730. at_duration_h=`(expr $at_duration_m / 60) 2>/dev/null`
  731. at_duration_s=`(expr $at_duration_s % 60) 2>/dev/null`
  732. at_duration_m=`(expr $at_duration_m % 60) 2>/dev/null`
  733. at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"
  734. if test "$at_duration" != "h m s"; then
  735.   echo "$as_me: test suite duration: $at_duration" >&AS_MESSAGE_LOG_FD
  736. fi
  737.  
  738. # Wrap up the test suite with summary statistics.
  739. at_skip_count=`set dummy $at_skip_list; shift; echo $[@%:@]`
  740. at_fail_count=`set dummy $at_fail_list; shift; echo $[@%:@]`
  741. at_xpass_count=`set dummy $at_xpass_list; shift; echo $[@%:@]`
  742. at_xfail_count=`set dummy $at_xfail_list; shift; echo $[@%:@]`
  743.  
  744. at_run_count=`expr $at_group_count - $at_skip_count`
  745. at_unexpected_count=`expr $at_xpass_count + $at_fail_count`
  746. at_total_fail_count=`expr $at_xfail_count + $at_fail_count`
  747.  
  748. echo
  749. AS_BOX([Test results.])
  750. echo
  751. {
  752.   echo
  753.   AS_BOX([Test results.])
  754.   echo
  755. } >&AS_MESSAGE_LOG_FD
  756.  
  757. dnl
  758. dnl FIXME: this code is as far from i18n-cleanness as man
  759. dnl could imagine...
  760. dnl
  761. if test $at_run_count = 1; then
  762.   at_result="1 test"
  763.   at_were=was
  764. else
  765.   at_result="$at_run_count tests"
  766.   at_were=were
  767. fi
  768. if $at_errexit_p && test $at_unexpected_count != 0; then
  769.   if test $at_xpass_count = 1; then
  770.     at_result="$at_result $at_were run, one passed"
  771.   else
  772.     at_result="$at_result $at_were run, one failed"
  773.   fi
  774.   at_result="$at_result unexpectedly and inhibited subsequent tests."
  775. else
  776.   # Don't you just love exponential explosion of the number of cases?
  777.   case $at_xpass_count:$at_fail_count:$at_xfail_count in
  778.     # So far, so good.
  779.     0:0:0) at_result="$at_result $at_were successful." ;;
  780.     0:0:*) at_result="$at_result behaved as expected." ;;
  781.  
  782.     # Some unexpected failures
  783.     0:*:0) at_result="$at_result $at_were run,
  784. $at_fail_count failed unexpectedly." ;;
  785.  
  786.     # Some failures, both expected and unexpected
  787.     0:*:1) at_result="$at_result $at_were run,
  788. $at_total_fail_count failed ($at_xfail_count expected failure)." ;;
  789.     0:*:*) at_result="$at_result $at_were run,
  790. $at_total_fail_count failed ($at_xfail_count expected failures)." ;;
  791.  
  792.     # No unexpected failures, but some xpasses
  793.     *:0:*) at_result="$at_result $at_were run,
  794. $at_xpass_count passed unexpectedly." ;;
  795.  
  796.     # No expected failures, but failures and xpasses
  797.     *:1:0) at_result="$at_result $at_were run,
  798. $at_unexpected_count did not behave as expected ($at_fail_count unexpected failure)." ;;
  799.     *:*:0) at_result="$at_result $at_were run,
  800. $at_unexpected_count did not behave as expected ($at_fail_count unexpected failures)." ;;
  801.  
  802.     # All of them.
  803.     *:*:1) at_result="$at_result $at_were run,
  804. $at_xpass_count passed unexpectedly,
  805. $at_total_fail_count failed ($at_xfail_count expected failure)." ;;
  806.     *:*:*) at_result="$at_result $at_were run,
  807. $at_xpass_count passed unexpectedly,
  808. $at_total_fail_count failed ($at_xfail_count expected failures)." ;;
  809.   esac
  810.  
  811.   if test $at_skip_count = 0 && test $at_run_count -gt 1; then
  812.     at_result="All $at_result"
  813.   fi
  814. fi
  815.  
  816. # Now put skips in the mix.
  817. case $at_skip_count in
  818.   0) ;;
  819.   1) at_result="$at_result
  820. 1 test was skipped." ;;
  821.   *) at_result="$at_result
  822. $at_skip_count tests were skipped." ;;
  823. esac
  824.  
  825. if test $at_unexpected_count = 0; then
  826.   echo "$at_result"
  827.   echo "$at_result" >&AS_MESSAGE_LOG_FD
  828. else
  829.   echo "ERROR: $at_result" >&2
  830.   echo "ERROR: $at_result" >&AS_MESSAGE_LOG_FD
  831.   {
  832.     echo
  833.     AS_BOX([Summary of the failures.])
  834.  
  835.     # Summary of failed and skipped tests.
  836.     if test $at_fail_count != 0; then
  837.       echo "Failed tests:"
  838.       $SHELL $[0] $at_fail_list --list
  839.       echo
  840.     fi
  841.     if test $at_skip_count != 0; then
  842.       echo "Skipped tests:"
  843.       $SHELL $[0] $at_skip_list --list
  844.       echo
  845.     fi
  846.     if test $at_xpass_count != 0; then
  847.       echo "Unexpected passes:"
  848.       $SHELL $[0] $at_xpass_list --list
  849.       echo
  850.     fi
  851.     if test $at_fail_count != 0; then
  852.       AS_BOX([Detailed failed tests.])
  853.       echo
  854.       for at_group in $at_fail_list
  855.       do
  856.         # Normalize the test group number.
  857.         at_group_normalized=`expr "00000$at_group" : ".*\($at_format\)"`
  858.         # Create a fresh directory for the next test group, and enter.
  859.         at_group_dir=$at_suite_dir/$at_group_normalized
  860.         at_group_log=$at_group_dir/$as_me.log
  861.         cat $at_group_log
  862.         echo
  863.       done
  864.       echo
  865.     fi
  866.     if test -n "$at_top_srcdir"; then
  867.       AS_BOX([$at_top_builddir/config.log])
  868.       sed 's/^/| /' $at_top_builddir/config.log
  869.       echo
  870.     fi
  871.   } >&AS_MESSAGE_LOG_FD
  872.  
  873.   AS_BOX([$as_me.log was created.])
  874.  
  875.   echo
  876.   echo "Please send \`$as_me.log' and all information you think might help:"
  877.   echo
  878.   echo "   To: <AT_PACKAGE_BUGREPORT>"
  879.   echo "   Subject: @<:@AT_PACKAGE_STRING@:>@ $as_me:dnl
  880. $at_fail_list${at_fail_list:+ failed${at_xpass_list:+,}}dnl
  881. $at_xpass_list${at_xpass_list:+ passed unexpectedly}"
  882.   echo
  883.   if test $at_debug_p = false; then
  884.     echo
  885.     echo 'You may investigate any problem if you feel able to do so, in which'
  886.     echo 'case the test suite provides a good starting point.'
  887.     echo
  888.   fi
  889.     exit 1
  890. fi
  891.  
  892. exit 0
  893. m4_divert_pop([TESTS_END])dnl
  894. dnl End of AT_INIT: divert to KILL, only test groups are to be
  895. dnl output, the rest is ignored.  Current diversion is BODY, inherited
  896. dnl from M4sh.
  897. m4_divert_push([KILL])
  898. m4_wrap([m4_divert_pop([KILL])[]])
  899. ])# AT_INIT
  900.  
  901.  
  902. # _AT_ARG_OPTION(OPTIONS,HELP-TEXT,[ARGS],[ACTION-IF-GIVEN],
  903. #                [ACTION-IF-NOT-GIVEN])
  904. # ---------------------------------------------------------------------------
  905. # Internal implementation of AT_ARG_OPTION & AT_ARG_OPTION_ARG
  906. m4_defun([_AT_ARG_OPTION],
  907. [m4_divert_once([HELP_OTHER],
  908. [cat <<_ATEOF
  909.  
  910. Other options:
  911. _ATEOF
  912. ])dnl m4_divert_once HELP_OTHER
  913. m4_divert_text([HELP_OTHER],
  914. [cat <<_ATEOF
  915. $2
  916. _ATEOF])dnl
  917. dnl Turn our options into our desired strings
  918. m4_ifdef([AT_first_option],[m4_undefine([AT_first_option])])dnl
  919. m4_ifdef([AT_case],[m4_undefine([AT_case])])dnl
  920. m4_ifdef([AT_case_no],[m4_undefine([AT_case_no])])dnl
  921. m4_ifdef([AT_case_arg],[m4_undefine([AT_case_arg])])dnl
  922. m4_foreach([AT_option], m4_split(m4_normalize([$1]),[[ \|]+]),
  923. [m4_define_default([AT_first_option],AT_option)dnl
  924. m4_append([AT_case],m4_if(m4_len(AT_option),1,[],[-])[-]AT_option, [ | ])dnl
  925. m4_append([AT_case_no],[--no]AT_option, [ | ])dnl
  926. m4_append([AT_case_arg],m4_if(m4_len(AT_option),1,[],[-])[-]AT_option[=*], [ | ])dnl
  927. ])dnl m4_foreach AT_option
  928. dnl keep track so we or the user may process ACTION-IF-NOT-GIVEN
  929. m4_divert_once([PARSE_ARGS_BEGIN],
  930. [
  931. ##
  932. ## Set up package specific options.
  933. ##
  934. ])dnl
  935. m4_divert_text([PARSE_ARGS_BEGIN],
  936. [dnl Provide a default value for options without arguments.
  937. m4_ifvaln([$3],,[at_arg_[]m4_bpatsubst([AT_first_option], -, _)=false])dnl
  938. at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=false
  939. ])dnl m4_divert_text DEFAULTS
  940. m4_ifval([$3],[m4_divert_once([PARSE_ARGS_END],
  941. [
  942. ##
  943. ## Verify our last option didn't require an argument
  944. ##
  945. AS_IF([test -n "$at_prev"],[AS_ERROR([`$at_prev' requires an argument.])])])])
  946. m4_divert_text([PARSE_ARGS],
  947. [dnl Parse the options and args when necessary.
  948. m4_ifvaln([$3],
  949. [    AT_case )
  950.     at_prev=--m4_bpatsubst([AT_first_option], -, _)
  951.     ;;
  952.     AT_case_arg )
  953.     at_arg_[]m4_bpatsubst([AT_first_option], -, _)=$at_optarg
  954.     at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=:
  955.     $4
  956.     ;;],
  957. [    AT_case )
  958.     at_optarg=:
  959.     at_arg_[]m4_bpatsubst([AT_first_option], -, _)=:
  960.     at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=:
  961.     m4_ifval([$4],[$4])dnl
  962.     ;;
  963.     AT_case_no )
  964.     at_optarg=false
  965.     at_arg_[]m4_bpatsubst([AT_first_option], -, _)=false
  966.     at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=:
  967.     m4_ifval([$4],[$4])dnl
  968.     ;;])dnl m4_ifvaln $3
  969. ])dnl m4_divert_text PARSE_ARGS
  970. m4_ifvaln([$5],
  971. [m4_divert_once([PARSE_ARGS_END],
  972. [
  973. ##
  974. ## Process package specific options when _not_ supplied.
  975. ##])dnl m4_divert_once PARSE_ARGS_END
  976. m4_divert_text([PARSE_ARGS_END],
  977. [
  978. AS_IF([$at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)],,[$5])dnl
  979. ])dnl m4_divert_text PARSE_ARGS_END
  980. ])dnl m4_ifvaln $5
  981. ])dnl _AT_ARG_OPTION
  982.  
  983.  
  984. # AT_ARG_OPTION(OPTIONS,HELP-TEXT,[ACTION-IF-GIVEN],[ACTION-IF-NOT-GIVEN])
  985. # ------------------------------------------------------------------------
  986. # Accept a set of OPTIONS with arguments.  Add HELP-TEXT to the HELP_OTHER
  987. # diversion.
  988. #
  989. # Preceding dashes should not be passed into OPTIONS.  Users will be required
  990. # to pass `--' before long options and `-' before single character options.
  991. #
  992. # $at_arg_OPTION will be set to `:' if this option is received, `false' if
  993. # if --noOPTION is received, and `false' by default.
  994. #
  995. # Run ACTION-IF-GIVEN each time an option in OPTIONS is encountered with
  996. # $at_optarg set to `:' or `false' as appropriate.  $opt_arg is actually
  997. # just a copy of $at_arg_OPTION.
  998. #
  999. # ACTION-IF-NOT-GIVEN will be run once after option parsing is complete
  1000. # if no option from OPTIONS was found.
  1001. m4_defun([AT_ARG_OPTION],[_AT_ARG_OPTION([$1],[$2],,[$3],[$4])])
  1002.  
  1003.  
  1004. # AT_ARG_OPTION_ARG(OPTIONS,HELP-TEXT,[ACTION-IF-GIVEN],[ACTION-IF-NOT-GIVEN])
  1005. # ---------------------------------------------------------------------------
  1006. # Accept a set of OPTIONS with arguments, seperated by commas.  Add HELP-TEXT
  1007. # to the HELP_OTHER diversion.
  1008. #
  1009. # Preceding dashes should not be passed into OPTIONS.  Users will be required
  1010. # to pass `--' before long options and `-' before single character options.
  1011. #
  1012. # By default, any argument to these options will be assigned to the shell
  1013. # variable $at_arg_OPTION, where OPTION is the first option in OPTIONS with
  1014. # any `-' characters replaced with `_'.
  1015. #
  1016. # Run ACTION-IF-GIVEN each time an option in OPTIONS is encountered with
  1017. # $at_optarg set.  $at_optarg is actually just a copy of $at_arg_OPTION.
  1018. #
  1019. # ACTION-IF-NOT-GIVEN will be run once after option parsing is complete
  1020. # if no option from OPTIONS was found.
  1021. m4_defun([AT_ARG_OPTION_ARG],[_AT_ARG_OPTION([$1],[$2],1,[$3],[$4])])
  1022.  
  1023.  
  1024. # AT_TESTED(PROGRAMS)
  1025. # -------------------
  1026. # Specify the list of programs exercised by the test suite.  Their
  1027. # versions are logged, and in the case of embedded test suite, they
  1028. # must correspond to the version of the package..  The PATH should be
  1029. # already preset so the proper executable will be selected.
  1030. m4_define([AT_TESTED],
  1031. [m4_append_uniq([AT_tested], [$1], [ ])])
  1032.  
  1033.  
  1034. # AT_SETUP(DESCRIPTION)
  1035. # ---------------------
  1036. # Start a group of related tests, all to be executed in the same subshell.
  1037. # The group is testing what DESCRIPTION says.
  1038. m4_define([AT_SETUP],
  1039. [m4_ifdef([AT_keywords], [m4_undefine([AT_keywords])])
  1040. m4_define([AT_line], AT_LINE)
  1041. m4_define([AT_xfail], [at_xfail=no])
  1042. m4_define([AT_description], [$1])
  1043. m4_define([AT_ordinal], m4_incr(AT_ordinal))
  1044. m4_append([AT_groups_all], [ ]m4_defn([AT_ordinal]))
  1045. m4_divert_push([TESTS])dnl
  1046.   AT_ordinal ) @%:@ AT_ordinal. m4_defn([AT_line]): $1
  1047.     at_setup_line='m4_defn([AT_line])'
  1048.     at_desc='$1'
  1049.     $at_quiet $ECHO_N "m4_format([[%3d: %-45s]],
  1050.                    AT_ordinal, [$1])[]$ECHO_C"
  1051. m4_divert_push([TEST_SCRIPT])dnl
  1052. ])
  1053.  
  1054.  
  1055. # AT_XFAIL_IF(SHELL-EXPRESSION)
  1056. # -----------------------------------
  1057. # Set up the test to be expected to fail if SHELL-EXPRESSION evaluates to
  1058. # true (exitcode = 0).
  1059. m4_define([AT_XFAIL_IF],
  1060. [dnl
  1061. dnl Try to limit the amount of conditionals that we emit.
  1062. m4_case([$1],
  1063.       [], [],
  1064.       [false], [],
  1065.       [:], [m4_define([AT_xfail], [at_xfail=yes])],
  1066.       [true], [m4_define([AT_xfail], [at_xfail=yes])],
  1067.       [m4_append([AT_xfail], [
  1068.       $1 && at_xfail=yes])])])
  1069.  
  1070.  
  1071. # AT_KEYWORDS(KEYOWRDS)
  1072. # ---------------------
  1073. # Declare a list of keywords associated to the current test group.
  1074. m4_define([AT_KEYWORDS],
  1075. [m4_append_uniq([AT_keywords], [$1], [ ])])
  1076.  
  1077.  
  1078. # AT_CLEANUP
  1079. # ----------
  1080. # Complete a group of related tests.
  1081. m4_define([AT_CLEANUP],
  1082. [m4_append([AT_help_all],
  1083. m4_defn([AT_ordinal]);m4_defn([AT_line]);m4_defn([AT_description]);m4_ifdef([AT_keywords], [m4_defn([AT_keywords])]);
  1084. )dnl
  1085. m4_divert_pop([TEST_SCRIPT])dnl Back to TESTS
  1086.     AT_xfail
  1087.     (
  1088.       echo "AT_ordinal. m4_defn([AT_line]): testing $1..."
  1089.       $at_traceon
  1090. m4_undivert([TEST_SCRIPT])dnl Insert the code here
  1091.       $at_traceoff
  1092.       $at_times_p && times >$at_times_file
  1093.     ) AS_MESSAGE_LOG_FD>&1 2>&1 | eval $at_tee_pipe
  1094.     at_status=`cat $at_status_file`
  1095.     ;;
  1096.  
  1097. m4_divert_pop([TESTS])dnl Back to KILL.
  1098. ])# AT_CLEANUP
  1099.  
  1100.  
  1101. # AT_BANNER(TEXT)
  1102. # ---------------
  1103. # Output TEXT without any shell expansion.
  1104. m4_define([AT_BANNER],
  1105. [m4_define([AT_banner_ordinal], m4_incr(AT_banner_ordinal))
  1106. m4_append([AT_groups_all], [ banner-]m4_defn([AT_banner_ordinal]))
  1107. m4_divert_text([TESTS],
  1108. [
  1109.   banner-AT_banner_ordinal ) @%:@ Banner AT_banner_ordinal. AT_LINE
  1110.     cat <<\_ATEOF
  1111.  
  1112. $1
  1113.  
  1114. _ATEOF
  1115.     ;;
  1116. ])dnl
  1117. ])# AT_BANNER
  1118.  
  1119.  
  1120. # AT_DATA(FILE, CONTENTS)
  1121. # -----------------------
  1122. # Initialize an input data FILE with given CONTENTS, which should end with
  1123. # an end of line.
  1124. # This macro is not robust to active symbols in CONTENTS *on purpose*.
  1125. # If you don't want CONTENT to be evaluated, quote it twice.
  1126. m4_define([AT_DATA],
  1127. [cat >$1 <<'_ATEOF'
  1128. $2[]_ATEOF
  1129. ])
  1130.  
  1131.  
  1132. # AT_CHECK(COMMANDS, [STATUS = 0], STDOUT, STDERR,
  1133. #          [RUN-IF-FAIL], [RUN-IF-PASS])
  1134. # ------------------------------------------------
  1135. # Execute a test by performing given shell COMMANDS.  These commands
  1136. # should normally exit with STATUS, while producing expected STDOUT and
  1137. # STDERR contents.  Shell metacharacters in STDOUT and STDERR are
  1138. # _not_ processed by the shell, but are treated as string literals.
  1139. #
  1140. # STATUS, STDOUT, and STDERR are not checked if equal to `ignore'.
  1141. #
  1142. # If STDOUT is `expout', then stdout is compared to the content of the file
  1143. # `expout'.  Likewise for STDERR and `experr'.
  1144. #
  1145. # If STDOUT is `stdout', then the stdout is left in the file `stdout',
  1146. # likewise for STDERR and `stderr'.  Don't do this:
  1147. #
  1148. #    AT_CHECK([command >out])
  1149. #    # Some checks on `out'
  1150. #
  1151. # do this instead:
  1152. #
  1153. #    AT_CHECK([command], [], [stdout])
  1154. #    # Some checks on `stdout'
  1155. #
  1156. # This is an unfortunate limitation inherited from Ultrix which will not
  1157. # let you redirect several times the same FD (see the Autoconf documentation).
  1158. # If you use the `AT_CHECK([command >out])' be sure to get a test suite
  1159. # that will show spurious failures.
  1160. #
  1161. # You might wonder why not just use `ignore' and directly use stdout and
  1162. # stderr left by the test suite.  Firstly because the names of these files
  1163. # is an internal detail, and secondly, because
  1164. #
  1165. #    AT_CHECK([command], [], [ignore])
  1166. #    AT_CHECK([check stdout])
  1167. #
  1168. # will use `stdout' both in input and output: undefined behavior would
  1169. # certainly result.  That's why the test suite will save them in `at-stdout'
  1170. # and `at-stderr', and will provide you with `stdout' and `stderr'.
  1171. #
  1172. # Any line of stderr starting with leading blanks and a `+' are filtered
  1173. # out, since most shells when tracing include subshell traces in stderr.
  1174. # This may cause spurious failures when the test suite is run with `-x'.
  1175. #
  1176. m4_define([AT_CHECK],
  1177. [_AT_CHECK([$1],[$2],[$3],[$4],[$5],[$6],1)])
  1178.  
  1179. # AT_CHECK_NOESCAPE(COMMANDS, [STATUS = 0], STDOUT, STDERR,
  1180. #                   [RUN-IF-FAIL], [RUN-IF-PASS])
  1181. # ---------------------------------------------------------
  1182. # Like AT_CHECK, but do not AS_ESCAPE shell metacharacters in the STDOUT
  1183. # and STDERR arguments before running the comparison.
  1184. m4_define([AT_CHECK_NOESCAPE],
  1185. [_AT_CHECK([$1],[$2],[$3],[$4],[$5],[$6])])
  1186.  
  1187.  
  1188.  
  1189. # _AT_CHECK(COMMANDS, [STATUS = 0], STDOUT, STDERR,
  1190. #           [RUN-IF-FAIL], [RUN-IF-PASS], SHELL_ESCAPE_IO)
  1191. # ---------------------------------------------------------
  1192. # Worker for AT_CHECK & AT_CHECK_NOESCAPE.  The final SHELL-ESCAPE-IO
  1193. # argument determines whether the STDOUT & STDERR arguments will be escaped or
  1194. # not.
  1195. #
  1196. #
  1197. # Implementation Details
  1198. # ----------------------
  1199. # Ideally, we would like to run
  1200. #
  1201. #    ( $at_traceon; COMMANDS >at-stdout 2> at-stderr )
  1202. #
  1203. # but we must group COMMANDS as it is not limited to a single command, and
  1204. # then the shells will save the traces in at-stderr. So we have to filter
  1205. # them out when checking stderr, and we must send them into the test suite's
  1206. # stderr to honor -x properly.
  1207. #
  1208. # Limiting COMMANDS to a single command is not good either, since them
  1209. # the user herself would use {} or (), and then we face the same problem.
  1210. #
  1211. # But then, there is no point in running
  1212. #
  1213. #   ( $at_traceon { $1 ; } >at-stdout 2>at-stder1 )
  1214. #
  1215. # instead of the simpler
  1216. #
  1217. #  ( $at_traceon; $1 ) >at-stdout 2>at-stder1
  1218. #
  1219. m4_define([_AT_CHECK],
  1220. [$at_traceoff
  1221. echo "AT_LINE: AS_ESCAPE([$1])"
  1222. echo AT_LINE >$at_check_line_file
  1223. ( $at_traceon; $1 ) >$at_stdout 2>$at_stder1
  1224. at_status=$?
  1225. grep '^ *+' $at_stder1 >&2
  1226. grep -v '^ *+' $at_stder1 >$at_stderr
  1227. at_failed=false
  1228. dnl Check stderr.
  1229. m4_case([$4],
  1230.     stderr, [echo stderr:; tee stderr <$at_stderr],
  1231.     ignore, [echo stderr:; cat $at_stderr],
  1232.     experr, [$at_diff experr $at_stderr || at_failed=:],
  1233.     [],     [$at_diff $at_devnull $at_stderr || at_failed=:],
  1234.     [echo >>$at_stderr; echo "m4_ifval([$7],[AS_ESCAPE([$4])],[$4])" | $at_diff - $at_stderr || at_failed=:])
  1235. dnl Check stdout.
  1236. m4_case([$3],
  1237.     stdout, [echo stdout:; tee stdout <$at_stdout],
  1238.     ignore, [echo stdout:; cat $at_stdout],
  1239.     expout, [$at_diff expout $at_stdout || at_failed=:],
  1240.     [],     [$at_diff $at_devnull $at_stdout || at_failed=:],
  1241.     [echo >>$at_stdout; echo "m4_ifval([$7],[AS_ESCAPE([$3])],[$3])" | $at_diff - $at_stdout || at_failed=:])
  1242. dnl Check exit val.  Don't `skip' if we are precisely checking $? = 77.
  1243. case $at_status in
  1244. m4_case([$2],
  1245.   [77],
  1246.     [],
  1247.     [   77) echo 77 > $at_status_file
  1248.             exit 77;;
  1249. ])dnl
  1250. m4_case([$2],
  1251.   [ignore],
  1252.     [   *);;],
  1253.     [   m4_default([$2], [0])) ;;
  1254.    *) echo "AT_LINE: exit code was $at_status, expected m4_default([$2], [0])"
  1255.       at_failed=:;;])
  1256. esac
  1257. AS_IF($at_failed, [$5
  1258.   echo 1 > $at_status_file
  1259.   exit 1], [$6])
  1260. $at_traceon
  1261. ])# AT_CHECK_NOESCAPE
  1262.